package com.senyint.sys.utils.spring;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.filefilter.RegexFileFilter;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;

import com.senyint.sys.utils.FilePathUtils;
import com.senyint.sys.utils.FileUtils;
import com.senyint.sys.utils.log.Log;

/**
 * {@code ResourceUtils}
 * 
 * @Description: 查找resource工具
 *               <p>
 * @author WangNaiFei,WangNaiFei@senyint.com
 * @date 2017年9月30日 下午3:52:25
 * @version 1.0
 * @version 1.1 新增获取单个资源方法 getResouceFromUserDir
 * @since jdk1.7+
 */
public class ResourceUtils {

	/**
	 * @Title: getResouceFromUserDir
	 * @Description: 查询User.dir下的资源文件
	 * @author WangNaiFei,WangNaiFei@senyint.com
	 * @date 2018年3月2日 上午11:36:06
	 * @version 1.0
	 * @param filePattern
	 * @return
	 */
	public static Resource getOneResouceFromUserDir(String filePattern) {
		List<Resource> resoucesFromUserDir = getResoucesFromUserDir(filePattern);
		int size = resoucesFromUserDir.size();
		if (size == 0) {
			return null;
		} else if (size == 1) {
			return resoucesFromUserDir.get(0);
		} else {
			throw new RuntimeException("获取一个资源，应返回null或一个resource，但是结果数量为：" + size);
		}
	}

	/**
	 * @Title: getResouceFromUserDir
	 * @Description: 获取User.dir下的资源文件
	 * @author WangNaiFei,WangNaiFei@senyint.com
	 * @date 2018年3月5日 下午3:36:36
	 * @version 1.0
	 * @param paths
	 * @return
	 * @throws FileNotFoundException
	 */
	public static Resource getResouceFromUserDir(String... paths) throws FileNotFoundException {
		StringBuffer append = FilePathUtils.append(System.getProperty("user.dir"));
		for (String path : paths) {
			append.append(path);
		}
		File resourceFile = new File(append.toString());
		if (resourceFile.exists()) {
			if (resourceFile.isFile()) {
				return new FileSystemResource(resourceFile);
			} else {
				throw new FileNotFoundException("file:" + append.toString() + " is not a file");
			}
		} else {
			throw new FileNotFoundException("file:" + append.toString() + " is not found");
		}
	}

	/**
	 * @Title: getResoucesFromUserDir
	 * @Description: 查询User.dir下的资源文件
	 * @author WangNaiFei,WangNaiFei@senyint.com
	 * @date 2017年9月30日 下午3:52:40
	 * @version 1.0
	 * @param filePattern
	 * @return
	 */
	public static List<Resource> getResoucesFromUserDir(String filePattern) {
		File userdir = new File(System.getProperty("user.dir"));
		return getResources(userdir, filePattern);
	}

	/**
	 * @Title: getResources
	 * @Description: 查找特定目录下的资源文件
	 * @author WangNaiFei,WangNaiFei@senyint.com
	 * @date 2017年9月30日 下午3:53:19
	 * @version 1.0
	 * @param resourceDir
	 * @param filePattern
	 * @return
	 */
	public static List<Resource> getResources(File resourceDir, String filePattern) {
		ArrayList<File> mapperFileList = new ArrayList<File>();
		FileUtils.getAllFiles(resourceDir, mapperFileList, new RegexFileFilter(filePattern));
		return getResources(mapperFileList.toArray(new File[mapperFileList.size()]));
	}

	/**
	 * @Title: getResources
	 * @Description: 文件转换成resource
	 * @author WangNaiFei,WangNaiFei@senyint.com
	 * @date 2017年9月30日 下午3:53:56
	 * @version 1.0
	 * @param files
	 * @return
	 */
	public static List<Resource> getResources(File... files) {
		List<Resource> rs = new ArrayList<Resource>();
		for (File file : files) {
			if (file.isFile()) {
				rs.add(new FileSystemResource(file));
			} else {
				Log.INSTANCE.debug("File:{},is not a file", file.getPath());
			}
		}
		return rs;
	}

}
